import { contextBridge, ipcRenderer } from 'electron'
import { electronAPI } from '@electron-toolkit/preload'

// Custom APIs for renderer
// 改个名字和Api.js做区分
const myApi = {
  loginOrRegisterSwitch: (isLogin) => {
    /* 注册/登录状态变化，向主进程发送消息 */
    ipcRenderer.send("loginOrRegisterSwitch", isLogin)
  },
  reLogin: () => {
    /* 重新登录 */
    ipcRenderer.send("reLogin")
  },
  openChat: (config) => {
    /* 打开聊天窗口 */
    return ipcRenderer.invoke("openChat", config)
  },
  winTitleOp: (data) => {
    /* 窗口标题栏操作 */
    ipcRenderer.send("winTitleOp", data)
  },
  setLocalStore: (data) => {
    /* 设置本地存储 */
    ipcRenderer.send("setLocalStore", data)
  },
  getLocalStore: (key) => {
    /* 获取主进程store存储信息 */
    return ipcRenderer.invoke("getLocalStore", key)
  },
  getChatSessionUserList: () => {
    /* 从数据库中获取聊天会话内容 */
    return ipcRenderer.invoke("getChatSessionUserList")
  },
  setChatSessionTop: (data) => {
    /* 设置会话置顶/取消置顶 */
    ipcRenderer.send("setChatSessionTop", data)
  },
  delChatSession: (contactId) => {
    /* 删除会话（设置会话不可见） */
    ipcRenderer.send("delChatSession", contactId)
  },
  getChatMessageList: (data) => {
    /* 获取聊天信息列表 */
    return ipcRenderer.invoke("getChatMessageList", data)
  },
  saveChatMessage: (data) => {
    /* 保存发送的聊天信息 */
    ipcRenderer.send("saveChatMessage", data)
  },
  setSessionInfo: (data) => {
    /* 设置会话信息，记录当前的sessionId，并使用contactId将选中的会话的未读消息清空 */
    ipcRenderer.send("setSessionInfo", data)
  },
  createAvatarCover: (path) => {
    /* 创建头像缩略图，返回头像和缩略图的流对象 */
    return ipcRenderer.invoke("createAvatarCover", path)
  },
  openMediaDetailWindow: (data) => {
    /* 打开媒体文件详情窗口 */
    ipcRenderer.send("openMediaDetailWindow", data)
  },
  saveAs: (data) => {
    /* 保存文件到本地 */
    ipcRenderer.send("saveAs", data)
  },
  saveClipboardFile: (data) => {
    /* 保存剪切板中的文件到本地 */
    ipcRenderer.invoke("saveClipboardFile", data)
  },
  getUserSetting: () => {
    /* 获取设置信息 */
    return ipcRenderer.invoke("getUserSetting")
  },
  updateContactNoReadCount: (data) => {
    /* 更新未读申请消息数量 */
    ipcRenderer.send("updateContactNoReadCount", data)
  },
  changeFileFolder: (data) => {
    /* 修改文件夹信息 */
    return ipcRenderer.invoke("changeFileFolder", data)
  },
  openFileFolder: (data) => {
    /* 打开文件夹 */
    ipcRenderer.send("openFileFolder", data)
  },
  reloadChatSession: (contactId) => {
    /* 重新加载被删除的会话，并把会话状态改为显示，返回修改后的会话信息 */
    return ipcRenderer.invoke("reloadChatSession", contactId)
  },
  downloadUpdate: (data) => {
    /* 下载更新的应用文件 */
    ipcRenderer.send("downloadUpdate", data)
  },
  openUrl: (url) => {
    /* 打开url（更新应用的下载方式为外链时） */
    ipcRenderer.send("openUrl", url)
  },
  getUserEmailList: () => {
    /* 获取登陆过的用户的列表 */
    return ipcRenderer.invoke("getUserEmailList")
  },

  onReceiveMessage: (callback) => {
    /* 监听主进程发送给渲染进程的 收到ws聊天消息 的通信 */
    ipcRenderer.on("receiveMessage", callback)
  },
  onFileUploadDone: (callback) => {
    /* 监听主进程发送给渲染进程的 上传文件完成 的通信，渲染进程可以展示文件的缩略图 */
    ipcRenderer.on("fileUploadDone", callback)
  },
  onNewWindowInit: (callback) => {
    /* 监听主进程发送给渲染进程的 新窗口初始化 的通信 */
    ipcRenderer.on("newWindowInit", callback)
  },
  onReLogin: (callback) => {
    /* 监听主进程发送给渲染进程的 重新登录 的通信 */
    ipcRenderer.on("reLogin", callback)
  },
  onCopying: (callback) => {
    /* 监听主进程发送给渲染进程的 正在拷贝文件 的通信 */
    ipcRenderer.on("copying", callback)
  },
  onUpdateDownloadProgress: (callback) => {
    /* 监听主进程发送给渲染进程的 当前下载更新文件的进度 的通信 */
    ipcRenderer.on("updateDownloadProgress", callback)
  },
  onSetForceReload: (callback) => {
    /* 监听主进程发送给渲染进程的 修改是否强制获取文件的存储库信息 的通信 */
    ipcRenderer.on("setForceReload", callback)
  },

  removeAllListeners: (name) => {
    /* 移除监听 */
    ipcRenderer.removeAllListeners(name)
  }
}

// Use `contextBridge` APIs to expose Electron APIs to
// renderer only if context isolation is enabled, otherwise
// just add to the DOM global.
if (process.contextIsolated) {
  try {
    contextBridge.exposeInMainWorld('electron', electronAPI)
    contextBridge.exposeInMainWorld('myApi', myApi)
  } catch (error) {
    console.error(error)
  }
} else {
  window.electron = electronAPI
  window.myApi = myApi
}
